package com.mjlf.mjatis.alias;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mjlf.mjatis.config.Configuration;
import com.mjlf.mjatis.exception.AliasException;
import lombok.Data;
import lombok.extern.java.Log;

import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;

/**
 * @ClassName AliasUtils
 * @Author mjlft
 * @Date 2020/5/28 20:18
 * @Version 1.0
 * @Description 别名解析工具类，用于转换Json对象为别名实体类
 */
@Data
@Log
public final class AliasUtils {

    /**
     * 将Json配置Alias转换为Alias对象
     * @param aliasesArray
     * @return
     */
    public static Set<Alias> parse(JSONArray aliasesArray){
        if(aliasesArray == null)
            return null;
        //设置初始容量，避免数据过多扩容
        Set<Alias> aliases = new HashSet<Alias>((int)(aliasesArray.size() / 0.75) + 1);

        //单个配置解析
        for(int i = 0; i < aliasesArray.size(); i ++){
            Alias alias = parse(aliasesArray.getJSONObject(i));
            if(alias == null){
                continue;
            }
            aliases.add(alias);
        }
        return aliases;
    }

    /**
     * 解析别名
     * @param aliasJson
     * @return
     */
    public static Alias parse(JSONObject aliasJson) throws AliasException {
        if(aliasJson == null){
            return null;
        }
        try {
            String name = aliasJson.getString("name");
            String classPath = aliasJson.getString("classPath");
            Class aliasClass = Class.forName(classPath);

            Alias alias = new Alias(name, aliasClass, classPath);
            return alias;
        }catch (Exception e){
            log.info("解析别名错误:" + aliasJson.toString());
            AliasException aliasException = new AliasException("解析别名异常" + e.getMessage());
            aliasException.setStackTrace(e.getStackTrace());
            throw aliasException;
        }
    }

    /**
     * 扫描包路径， 找到所有的别名注解， 然后创建对应的别名实体
     * @param basePackagePath
     * @return
     */
    public static Set<Alias> parse(String basePackagePath){
        return null;
    }
}
